home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------------------------- */
- /* ----- Let 'em Fly! V 1.2 ----------- (c) 1991-93 by Oliver Scheel ----- */
- /* ------------------------------------------------------------------------- */
- /* ----- Module: ltmf_edt.c new form_keybd() & new objc_edit() ----------- */
- /* ------------------------------------------------------------------------- */
-
- #include <stdio.h>
- #include <string.h>
- #include <macros.h>
- #include <ctype.h>
- #include <smallaes.h>
- #include <vdi.h>
- #include <tos.h>
- #include <portab.h>
-
- #include "ltmf_str.h"
- #include "ltmf_def.h"
-
- /* ------------------------------------------------------------------------- */
-
- #ifdef ENGLISH
- #define NOSCRAP "[1][| No clipboard available! ][ Cancel ]"
- #else
- #define NOSCRAP "[1][| Kein Klemmbrett vorhanden! ][ Abbruch ]"
- #endif
-
- /* ------------------------------------------------------------------------- */
-
- WORD ispname _((WORD ch));
- WORD isfname _((WORD ch));
- WORD isedctrl _((WORD ch));
-
- VOID obj_xywh _((OBJECT *tree, WORD obj, GRECT *p));
- VOID obj_update _((OBJECT *tree, WORD obj));
-
- VOID rc_gtov _((GRECT *gr, VRECT *vr));
-
- WORD nfm_alert _((WORD but, CHAR *string));
-
- VOID _und_obj _((OBJECT *tree, KBDTAB *ktab, WORD obj, WORD mode));
-
- CHAR STDARGS ins_spcchar _((VOID));
- VOID STDARGS obj_clsize _((OBJECT *tree, WORD obj, WORD *x, WORD *y, WORD *w, WORD *h));
-
-
- WORD STDARGS hist_insert _((CHAR *str));
-
-
- MLOCAL WORD _set_text _((OBJECT *tree, WORD obj, CHAR *txt, WORD *idx));
- MLOCAL WORD _hist_match _((CHAR *str, WORD len, WORD dir));
- MLOCAL WORD _hist_browse _((OBJECT *tree, WORD obj, WORD *idx, CHAR *match, WORD dir));
- MLOCAL WORD _find_obj _((OBJECT *tree, WORD startobj, WORD flag, WORD mode));
- MLOCAL WORD _get_scrap _((CHAR *scrp));
-
- /* ------------------------------------------------------------------------- */
-
- EXTERN OBJECT *lasttree;
- EXTERN WORD magic;
- EXTERN WORD keys;
- EXTERN KBDTAB keytable[];
- EXTERN WORD ed_flag;
-
- /* ------------------------------------------------------------------------- */
-
- CHAR history[MAXHIST][HISTLEN+1]; /* history buffer */
-
- WORD histlow = 0; /* history pointers */
- WORD histhi = 0;
- WORD lastptr = 0; /* browse pointer */
- WORD ed_dirty; /* edit field 'dirty' */
- CHAR lastmatch[HISTLEN+1];
-
- /* ------------------------------------------------------------------------- */
- /* ----- utilities --------------------------------------------------------- */
- /* ------------------------------------------------------------------------- */
-
- MLOCAL WORD _set_text(tree, obj, txt, idx)
- OBJECT *tree;
- WORD obj;
- CHAR *txt;
- WORD *idx;
- {
- WORD i, j,
- ok,
- slen,
- pvlen;
- CHAR lastvalid,
- ch;
- TEDINFO *ted;
-
- objc_edit(tree, obj, 0, idx, ED_END);
- ted = tree[obj].ob_spec.tedinfo;
- for(i = 0, slen = 0; ted->te_ptmplt[i]; i++)
- {
- if(ted->te_ptmplt[i] == '_')
- slen++;
- }
- /* slen = ted->te_txtlen;
- */ pvlen = (WORD)strlen(ted->te_pvalid);
- i = j = 0;
- while((i < slen) && txt[j] && (txt[j] != '\n') && (txt[j] != '\r'))
- {
- if(i < pvlen)
- lastvalid = ted->te_pvalid[i];
- ch = txt[j++];
- switch(lastvalid)
- {
- case '9' :
- ok = isdigit(ch) ? TRUE : FALSE;
- break;
- case 'A' :
- ch = toupper(ch);
- ok = (isupper(ch) || isspace(ch)) ? TRUE : FALSE;
- break;
- case 'a' :
- ok = (isalpha(ch) || isspace(ch)) ? TRUE : FALSE;
- break;
- case 'N' :
- ch = toupper(ch);
- ok = (isupper(ch) || isspace(ch) || isdigit(ch)) ? TRUE : FALSE;
- break;
- case 'n' :
- ok = (isalpha(ch) || isspace(ch) || isdigit(ch)) ? TRUE : FALSE;
- break;
- case 'F' :
- ch = toupper(ch);
- ok = (isfname(ch) || isspace(ch)) ? TRUE : FALSE;
- break;
- case 'f' :
- ch = toupper(ch);
- ok = (isfname(ch) && (ch != ':') && (ch != '?') && (ch != '*')) ? TRUE : FALSE;
- break;
- case 'P' :
- ch = toupper(ch);
- ok = ispname(ch) ? TRUE : FALSE;
- break;
- case 'p' :
- ch = toupper(ch);
- ok = (ispname(ch) && (ch != '?') && (ch != '*')) ? TRUE : FALSE;
- break;
- case 'X' :
- ok = TRUE;
- break;
- default :
- ok = FALSE;
- }
- if(ok)
- ted->te_ptext[i++] = ch;
- }
- ted->te_ptext[i] = '\0';
- obj_update(tree, obj);
- objc_edit(tree, obj, 0, idx, ED_INIT);
- return(i);
- }
-
- /* ----- history functions ------------------------------------------------- */
-
- MLOCAL WORD _hist_match(str, len, dir)
- CHAR *str;
- WORD len;
- WORD dir;
- {
- REG WORD i,
- inc;
-
- inc = (dir == FMD_FORWARD) ? 1 : -1;
- i = lastptr;
- while(i != ((dir == FMD_FORWARD) ? histhi : histlow))
- {
- i += inc;
- if(i >= MAXHIST)
- i = 0;
- else if(i < 0)
- i = MAXHIST - 1;
- if(!strncmp(history[i], str, len) /* && (history[i][0] != '\0') */ )
- return(i);
- }
- return(-1);
- }
-
- WORD STDARGS hist_insert(str)
- CHAR *str;
- {
- lastptr = histhi;
- if((*str != '\0') && (_hist_match(str, HISTLEN, FMD_BACKWARD) == -1))
- {
- strncpy(history[histhi], str, HISTLEN);
- history[histhi][HISTLEN] = '\0';
- if(++histhi >= MAXHIST)
- histhi = 0;
- if(histhi == histlow)
- {
- if(++histlow >= MAXHIST)
- histlow = 0;
- }
- history[histhi][0] = '\0';
- return(TRUE);
- }
- else
- history[histhi][0] = '\0';
- return(FALSE);
- }
-
- MLOCAL WORD _hist_browse(tree, obj, idx, match, dir)
- OBJECT *tree;
- WORD obj;
- WORD *idx;
- CHAR *match;
- WORD dir;
- {
- WORD pos;
- WORD slen;
-
- if(lastptr == histhi)
- {
- strncpy(history[histhi], tree[obj].ob_spec.tedinfo->te_ptext, HISTLEN);
- history[histhi][HISTLEN] = '\0';
- ed_dirty = FALSE;
- }
- do
- {
- pos = _hist_match(match, (WORD)strlen(match), dir);
- if(pos != -1)
- {
- slen = _set_text(tree, obj, history[pos], idx);
- lastptr = pos;
- if(slen || (lastptr == histhi))
- return(TRUE);
- }
- }
- while(!slen && (pos != -1));
- Bconout(2, 7);
- return(FALSE);
- }
-
- /* ------------------------------------------------------------------------- */
- /* ----- new form_button() ------------------------------------------------- */
- /* ------------------------------------------------------------------------- */
-
- WORD nfm_button(tree, obj, clicks, nxtobj)
- OBJECT *tree;
- WORD obj;
- WORD clicks;
- WORD *nxtobj;
- {
- WORD ret;
-
- if(tree == lasttree)
- lasttree = NULL;
- ret = form_button(tree, obj, clicks, nxtobj);
- if(keys && (tree[obj].ob_flags & (SELECTABLE|EXIT|TOUCHEXIT)))
- _und_obj(tree, keytable, obj, 1);
- return(ret);
- }
-
- /* ------------------------------------------------------------------------- */
- /* ----- new form_keybd() -------------------------------------------------- */
- /* ------------------------------------------------------------------------- */
-
- MLOCAL WORD _find_obj(tree, startobj, flag, mode)
- OBJECT *tree;
- WORD startobj;
- WORD flag;
- WORD mode;
- {
- REG WORD obj;
- WORD inc,
- theflag,
- tflag;
-
- inc = (mode & FMD_BACKWARD) ? -1 : 1;
- tflag = (mode & FMD_TURN) ? TRUE : FALSE;
- obj = startobj;
- theflag = tree[obj].ob_flags;
- while(obj >= 0)
- {
- if((theflag & LASTOB) && !(mode & FMD_BACKWARD))
- {
- obj = (tflag) ? 0 : -1;
- tflag = FALSE;
- }
- else
- obj += inc;
- if(obj < 0)
- {
- if(tflag)
- {
- obj = _find_obj(tree, 0, LASTOB, FMD_FORWARD);
- tflag = FALSE;
- }
- else
- break;
- }
- theflag = tree[obj].ob_flags;
- if((theflag & flag) == flag)
- return(obj);
- }
- return(startobj);
- }
-
- /* ------------------------------------------------------------------------- */
-
- WORD nfm_keybd(tree, obj, next_obj, thechar, pnxt_obj, pchar)
- OBJECT *tree;
- WORD obj;
- WORD next_obj;
- WORD thechar;
- WORD *pnxt_obj;
- WORD *pchar;
- {
- WORD d, ks;
- WORD obtyp;
- WORD pnob_sav;
- WORD fdir,
- def_obj,
- def_sav;
- GRECT gr;
- OBJECT *tr;
-
- if(tree == lasttree)
- lasttree = NULL;
- obtyp = tree[ROOT].ob_type & 0xff00;
- magic = ((UWORD)obtyp == MAGIC) ? TRUE : FALSE;
- if((obtyp == GLOBOFF) /* || (magic && (tree[ROOT].ob_flags & EXEDIT)) */)
- goto normal;
- if(letemfly.conf & C_EDIT)
- {
- graf_mkstate(&d, &d, &d, &ks);
- *pchar = thechar;
- *pnxt_obj = next_obj; /* `obj' don't work with MagicDials! */
- thechar >>= 8;
- if((thechar == 114) || (thechar == 28)) /* RETURN */
- {
- if((ks & K_CTRL) && (tree[obj].ob_flags & EDITABLE)) /* Control */
- {
- hist_insert(tree[obj].ob_spec.tedinfo->te_ptext);
- *pchar = 0;
- return(1);
- }
- if(ks & (K_LSHIFT|K_RSHIFT)) /* Shift */
- {
- *pnxt_obj = _find_obj(tree, obj, EDITABLE, FMD_FORWARD);
- if(*pnxt_obj == obj) /* MagicDial work around */
- *pnxt_obj = next_obj;
- }
- if(*pnxt_obj == next_obj) /* MagicDial work around */
- {
- *pnxt_obj = _find_obj(tree, ROOT, DEFAULT, FMD_FORWARD);
- if(!(*pnxt_obj))
- *pnxt_obj = _find_obj(tree, obj, EDITABLE, FMD_FORWARD);
- else
- {
- pnob_sav = *pnxt_obj;
- obj_xywh(tree, *pnxt_obj, &gr);
- objc_change(tree, *pnxt_obj, 0, gr.g_x, gr.g_y, gr.g_w, gr.g_h,
- tree[*pnxt_obj].ob_state|SELECTED, 1);
- *pnxt_obj = pnob_sav;
- *pchar = 0;
- return(0);
- }
- }
- }
- else if((thechar == 15) && ((ks & K_ALT) || !ed_flag)) /* ALT+Tab pressed */
- {
- def_obj = _find_obj(tree, ROOT, EXIT|SELECTABLE|DEFAULT, FMD_FORWARD);
- tr = &tree[def_obj];
- def_sav = def_obj;
- if(def_obj && ((tr->ob_type & 0xff) == G_BUTTON) /* && !(tr->ob_flags & TOUCHEXIT) */)
- {
- obj_clsize(tree, def_obj, &gr.g_x, &gr.g_y, &gr.g_w, &gr.g_h);
- tr->ob_flags &= ~DEFAULT;
- objc_draw(tree, ROOT, MAX_DEPTH, gr.g_x, gr.g_y, gr.g_w, gr.g_h);
- lasttree = NULL;
- _und_obj(tree, keytable, def_obj, 1);
- do
- {
- fdir = (ks & (K_LSHIFT|K_RSHIFT)) ? FMD_BACKWARD : FMD_FORWARD;
- def_obj = _find_obj(tree, def_obj, EXIT|SELECTABLE, fdir|FMD_TURN);
- tr = &tree[def_obj];
- }
- while((((tr->ob_type & 0xff) != G_BUTTON) || (tr->ob_state & DISABLED) || (tr->ob_flags & HIDETREE) /* || (tr->ob_flags & TOUCHEXIT) */ ) && (def_obj != def_sav));
- tr->ob_flags |= DEFAULT;
- obj_clsize(tree, def_obj, &gr.g_x, &gr.g_y, &gr.g_w, &gr.g_h);
- objc_draw(tree, def_obj, MAX_DEPTH, gr.g_x, gr.g_y, gr.g_w, gr.g_h);
- _und_obj(tree, keytable, def_obj, 1);
- }
- }
- else if(ks & (K_LSHIFT|K_RSHIFT)) /* Shift pressed */
- {
- switch(thechar)
- {
- case 15 : /* Tab */
- *pnxt_obj = _find_obj(tree, obj, EDITABLE, FMD_BACKWARD);
- break;
- case 71 : /* Clear Home */
- *pnxt_obj = _find_obj(tree, 0, EDITABLE, FMD_BACKWARD|FMD_TURN);
- break;
- default :
- return(1);
- }
- }
- else if(!ks) /* normal mode */
- {
- switch(thechar)
- {
- case 15 : /* Tab */
- *pnxt_obj = _find_obj(tree, obj, EDITABLE, FMD_FORWARD);
- break;
- case 71 : /* Clear Home */
- *pnxt_obj = _find_obj(tree, 0, EDITABLE, FMD_FORWARD);
- break;
- case 72 : /* Cursor Up */
- *pnxt_obj = _find_obj(tree, obj, EDITABLE, FMD_BACKWARD|FMD_TURN);
- break;
- case 80 : /* Cursor Down */
- *pnxt_obj = _find_obj(tree, obj, EDITABLE, FMD_FORWARD|FMD_TURN);
- break;
- default :
- return(1);
- }
- }
- else
- return(1);
- *pchar = 0;
- return(1);
- }
- normal: return(form_keybd(tree, obj, next_obj, thechar, pnxt_obj, pchar));
- }
-
- /* ------------------------------------------------------------------------- */
- /* ----- new objc_edit ----------------------------------------------------- */
- /* ------------------------------------------------------------------------- */
-
- MLOCAL WORD _get_scrap(scrp)
- CHAR *scrp;
- {
- WORD slen;
- CHAR *s[1];
-
- scrp_read(scrp);
- slen = (WORD)strlen(scrp);
- if(!slen)
- {
- shel_envrn(s, "CLIPBRD=");
- if(!*s)
- shel_envrn(s, "SCRAPDIR=");
- if(*s)
- {
- scrp_write(*s);
- strcpy(scrp, *s);
- slen = (WORD)strlen(scrp);
- }
- }
- if(slen)
- {
- if(scrp[slen-1] != '\\')
- strcat(scrp, "\\");
- return(TRUE);
- }
- #ifdef LIGHT
- form_alert(1, NOSCRAP);
- #else
- nfm_alert(1, NOSCRAP);
- #endif
- return(FALSE);
- }
-
- /* ------------------------------------------------------------------------- */
-
- WORD nob_edit(tree, obj, thechar, idx, kind)
- OBJECT *tree;
- WORD obj;
- WORD thechar;
- WORD *idx;
- WORD kind;
- {
- WORD index,
- ks, d;
- CHAR *ptxt,
- tchar,
- ch;
- WORD ptlen;
- CHAR scrapdir[128],
- delscrap[128],
- scrap[128],
- chbuf[64];
- WORD h, i,
- slen;
- WORD obtyp;
- CHAR valsav;
- OBJECT *tr;
-
- if(tree == lasttree)
- lasttree = NULL;
- tr = &tree[obj];
- index = *idx;
- obtyp = tree[ROOT].ob_type & 0xff00;
- magic = ((UWORD)obtyp == MAGIC) ? TRUE : FALSE;
- if(!((obtyp == GLOBOFF) /* || (magic && (tree[ROOT].ob_flags & EXEDIT)) */)
- && (letemfly.conf & C_EDIT) && (tr->ob_flags & EDITABLE)
- /* && !(magic && (tr->ob_flags & EXEDIT)) */)
- {
- if(kind == ED_CHAR)
- {
- graf_mkstate(&d, &d, &d, &ks);
- ptxt = tr->ob_spec.tedinfo->te_ptext;
- ptlen = (WORD)strlen(ptxt);
- tchar = thechar >> 8;
- if(histhi == lastptr)
- {
- strncpy(lastmatch, ptxt, HISTLEN);
- lastmatch[HISTLEN] = '\0';
- }
- if(ks & K_CTRL) /* Control pressed */
- {
- switch(tchar)
- {
- case 115 : /* Cursor left */
- (*idx)--;
- while((*idx >= 0) && !(isalnum(ptxt[*idx]) || (ptxt[*idx] & 0x80)))
- (*idx)--;
- while((*idx >= 0) && (isalnum(ptxt[*idx]) || (ptxt[*idx] & 0x80)))
- (*idx)--;
- (*idx)++;
- break;
- case 116 : /* Cursor right */
- while((*idx < ptlen) && (isalnum(ptxt[*idx]) || (ptxt[*idx] & 0x80)))
- (*idx)++;
- while((*idx < ptlen) && !(isalnum(ptxt[*idx]) || (ptxt[*idx] & 0x80)))
- (*idx)++;
- break;
- case 72 : /* Cursor up */
- _hist_browse(tree, obj, idx, "", FMD_BACKWARD);
- return(1);
- case 80 : /* Cursor down */
- _hist_browse(tree, obj, idx, "", FMD_FORWARD);
- return(1);
- case 47 : /* CTRL-V */
- if(_get_scrap(scrapdir))
- {
- strcpy(scrap, scrapdir);
- strcat(scrap, "SCRAP.TXT");
- h = (WORD)Fopen(scrap, 0);
- if(h > 0)
- {
- slen = (WORD)Fread(h, 63l, chbuf);
- Fclose(h);
- chbuf[slen] = '\0';
- if(ks & (K_LSHIFT|K_RSHIFT)) /* Shift */
- {
- ptlen = tr->ob_spec.tedinfo->te_txtlen; /* ??? */
- /* ptlen = (WORD)strlen(tr->ob_spec.tedinfo->te_pvalid);
- */ for(i = 0; (*idx < ptlen) && (chbuf[i] >= 32); i++)
- objc_edit(tree, obj, chbuf[i], idx, ED_CHAR);
- }
- else
- _set_text(tree, obj, chbuf, idx);
- }
- ed_dirty = TRUE;
- return(1);
- }
- break;
- case 45 : /* CTRL-X */
- case 46 : /* CTRL-C */
- if(_get_scrap(scrapdir))
- {
- strcpy(scrap, scrapdir);
- strcat(scrap, "SCRAP.TXT");
- if(ks & (K_LSHIFT|K_RSHIFT)) /* Shift */
- {
- h = (WORD)Fopen(scrap, 1);
- if(h <= 0)
- h = (WORD)Fcreate(scrap, 0);
- else
- {
- Fseek(0, h, 2);
- Fwrite(h, 2, "\r\n");
- }
- }
- else
- {
- strcpy(delscrap, scrapdir);
- strcat(delscrap, "SCRAP.*");
- while(!Fdelete(delscrap));
- h = (WORD)Fcreate(scrap, 0);
- }
- if(h > 0)
- {
- Fwrite(h, ptlen, ptxt);
- Fclose(h);
- }
- if(tchar == 45) /* CTRL-X */
- {
- objc_edit(tree, obj, 0, idx, ED_END);
- *idx = 0;
- ptxt[*idx] = '\0';
- obj_update(tree, obj);
- objc_edit(tree, obj, 0, idx, ED_INIT);
- }
- return(1);
- }
- break;
- case 83 : /* Delete */
- objc_edit(tree, obj, 0, idx, ED_END);
- ptxt[*idx] = '\0';
- obj_update(tree, obj);
- objc_edit(tree, obj, 0, idx, ED_INIT);
- return(1);
- default :
- goto normal;
- }
- }
- else if(ks & (K_LSHIFT|K_RSHIFT)) /* Shift pressed */
- {
- switch(tchar)
- {
- case 75 : /* Cursor left */
- *idx = 0;
- break;
- case 77 : /* Cursor right */
- *idx = ptlen;
- break;
- case 72 : /* Cursor up */
- _hist_browse(tree, obj, idx, lastmatch, FMD_BACKWARD);
- return(1);
- case 80 : /* Cursor down */
- _hist_browse(tree, obj, idx, lastmatch, FMD_FORWARD);
- return(1);
- case 82 : /* Insert */
- if(tr->ob_spec.tedinfo->te_pvalid[min(*idx, (WORD)strlen(tr->ob_spec.tedinfo->te_pvalid)-1)] == 'X')
- {
- ch = ins_spcchar();
- if(ch)
- {
- thechar = ch;
- goto normal;
- }
- }
- return(1);
- default :
- goto normal;
- }
- }
- else
- goto normal;
- objc_edit(tree, obj, 0, &index, ED_END);
- objc_edit(tree, obj, 0, idx, ED_END);
- return(1);
- }
- else if((kind == ED_END) && ed_dirty)
- {
- hist_insert(tr->ob_spec.tedinfo->te_ptext);
- ed_dirty = FALSE;
- }
- normal: lastptr = histhi;
- if(kind == ED_INIT)
- ed_dirty = FALSE;
- else if(kind == ED_CHAR)
- {
- ed_dirty = TRUE;
- history[histhi][0] = '\0';
- index = min(index, (WORD)strlen(tr->ob_spec.tedinfo->te_pvalid) - 1);
- valsav = tr->ob_spec.tedinfo->te_pvalid[index];
- /* if(valsav == '\0')
- valsav = tr->ob_spec.tedinfo->te_pvalid[--index];
- */ ch = thechar & 0xff;
- if((valsav == 'P') || (valsav == 'p') || (valsav == 'F') || (valsav == 'f'))
- {
- ptxt = tr->ob_spec.tedinfo->te_ptmplt;
- while(*ptxt && (*ptxt != '_'))
- ptxt++;
- for(i = index; *ptxt && i; ptxt++)
- {
- if(*ptxt == '_')
- i--;
- }
- while(*ptxt == '_')
- ptxt++;
- if((ptxt[0] == ch) && (ptxt[1] == '_'))
- ptxt = NULL;
- switch(valsav)
- {
- case 'F' :
- if(!(isfname(ch) || isedctrl(ch)) && ptxt)
- return(1);
- break;
- case 'f' :
- if(!((isfname(ch) && (ch != ':') && (ch != '?') && (ch != '*')) || isedctrl(ch)) && ptxt)
- return(1);
- break;
- case 'P' :
- if(!(ispname(ch) || isedctrl(ch)) && ptxt)
- return(1);
- break;
- case 'p' :
- if(!((ispname(ch) && (ch != '?') && (ch != '*')) || isedctrl(ch)) && ptxt)
- return(1);
- break;
- }
- thechar &= 0xff00;
- thechar |= toupper(ch);
- if(ptxt)
- tr->ob_spec.tedinfo->te_pvalid[index] = 'X';
- objc_edit(tree, obj, thechar, idx, kind);
- tr->ob_spec.tedinfo->te_pvalid[index] = valsav;
- return(1);
- }
- }
- }
- return(objc_edit(tree, obj, thechar, idx, kind));
- }
-